package com.syn;

import java.util.ArrayList;
import java.util.List;

/**
 * 表单自动映射管理类
 */
public class FormMappingMgr {

    private static List<FormMapping> formMappingList = new ArrayList<FormMapping>();

    private static void addFormMapping(FormMapping formMapping) {
        formMappingList.add(formMapping);
    }

    /**
     * 获取当前环节，当前表单，操做类型下的表单字段映射清单
     *
     * @return
     * @paramformId 表单标识
     * @paramactionId 环节标识
     * @paramtype 操做类型：初始化 / 更新
     */
    public static List<FormMapping> getMapping(String formId, String actionId, String type) {
        List<FormMapping> resultMappingList = new ArrayList < FormMapping > ();
        // 遍历查询出符合要求的映射信息
        for (FormMapping formMapping : formMappingList) {
            if (actionId.equals(formMapping.getActionId()) &&
                    type.equals(formMapping.getMappingType())) {
                if (FormMapping.MAPPING_TYPE_INIT.equals(type)
                        && formMapping.getDestForm().getFormId().equals(formId)) {
                    resultMappingList.add(formMapping);
                } else if (FormMapping.MAPPING_TYPE_UPDATE.equals(type)
                        && formMapping.getSrcForm().getFormId().equals(formId)) {
                    resultMappingList.add(formMapping);
                }
            }
        }
        return resultMappingList;
    }

    /**
     * 注册冗余数据映射关系
     * 本例中的代码只是做为示意参考 , 此部分的数据可保存在数据库或者配置文件中。
     * <p>
     * 实际应用中，字段的名称能够进一步经过 Java 反射机制动态获取，
     * 并提供相应的 UI 操做界面，供管理员配置。
     */
    public static void registerFormMapping() {
        FormInfo formA = new FormInfo("A", "FormObjectA", "sample.redundant.form.FormObjectA");
        FormInfo formB = new FormInfo("B", "FormObjectB", "sample.redundant.form.FormObjectB");
        FormInfo formC = new FormInfo("C", "FormObjectC", "sample.redundant.form.FormObjectC");

        // 在环节 3，建立 formC 的时候
        // 数据来源表单 formB 的查询条件为 workflowInstanceId
        //formC 的 phone 字段根据 formA 的 phone 字段初始化。（这里只有一个映射字段）
        FormMapping initFormCFromFormAMapping = new FormMapping ("1", formA, formC,"3", FormMapping.MAPPING_TYPE_INIT);
        initFormCFromFormAMapping.addQueryField("workflowInstanceId", "workflowInstanceId");
        initFormCFromFormAMapping.addMappingField("phone", "phone");
        FormMappingMgr.addFormMapping(initFormCFromFormAMapping);

        // 在环节 3，建立 formC 的时候
        // 数据来源表单 formB 的查询条件为 workflowInstanceId
        //formC 的 address 字段根据 formB 的 address 字段初始化
        FormMapping initFormCFromFormBMapping = new FormMapping
                ("4", formB, formC, "3", FormMapping.MAPPING_TYPE_INIT);
        initFormCFromFormBMapping.addQueryField("workflowInstanceId", "workflowInstanceId");
        initFormCFromFormBMapping.addMappingField("address", "address");
        FormMappingMgr.addFormMapping(initFormCFromFormBMapping);

        // 在环节 3，保存 formC 的时候
        // 目标表单 formA 的查询条件为 workflowInstanceId
        // 根据 formC 的 address 字段同步更新 formA 的 address 字段
        FormMapping updateFormCToFormAMapping = new FormMapping
                ("5", formC, formA, "3", FormMapping.MAPPING_TYPE_UPDATE);
        updateFormCToFormAMapping.addQueryField("workflowInstanceId", "workflowInstanceId");
        updateFormCToFormAMapping.addMappingField("address", "address");
        FormMappingMgr.addFormMapping(updateFormCToFormAMapping);

        // 在环节 3，保存 formC 的时候
        // 目标表单 formB 的查询条件为 workflowInstanceId
        // 根据 formC 的 phone 字段同步更新 formB 的 phone 字段
        FormMapping updateFormCToFormBMapping = new FormMapping
                ("6", formC, formB, "3", FormMapping.MAPPING_TYPE_UPDATE);
        updateFormCToFormBMapping.addQueryField("workflowInstanceId", "workflowInstanceId");
        updateFormCToFormBMapping.addMappingField("phone", "phone");
        FormMappingMgr.addFormMapping(updateFormCToFormBMapping);
    }

}
